<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>博客详情</title>
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/semantic-ui/2.2.10/semantic.min.css">
    <link rel="stylesheet" href="../static/css/me.css"> <!--引入自定义CSS样式-->
    <link rel="stylesheet" href="../static/css/typo.css">
    <link rel="stylesheet" href="../static/css/animate.css">
    <link rel="stylesheet" href="../static/lib/prism/prism.css">
    <link rel="stylesheet" href="../static/lib/tocbot/tocbot.css">
</head>
<body>
    <!--导航-->
    <nav class="ui inverted attached segment me-padded-tb-mini me-shadow-small"> <!--引入css样式-->
        <div class="ui container">
            <div class="ui inverted secondary menu stackable"><!--stackable可堆叠，解决手机访问-->
                <h2 class="ui teal header item">blog</h2> <!--item为menu中的一个条目-->
                <a href="#" class="m-item item me-mobile-hide"><i class="home icon"></i>首页</a><!--href为超链接-->
                <a href="#" class="m-item item me-mobile-hide"><i class="idea icon"></i>分类</a><!--m-item，在JQuery里获取样式-->
                <a href="#" class="m-item item me-mobile-hide"><i class="tags icon"></i>标签</a>
                <a href="#" class="m-item item me-mobile-hide"><i class="tags icon"></i>归档</a>
                <a href="#" class="m-item item me-mobile-hide"><i class="info icon"></i>关于我</a>
                <div class="right item">
                    <div class="ui icon input">
                        <label>
                            <input type="text" placeholder="Search...">
                        </label>
                        <i class="search link icon"></i>
                    </div>
                </div>
            </div>
        </div>
        <a href="#" class="ui black icon button me-top-right me-mobile-show menu toggle"> <!--手机端菜单图标, menu toggle获取点击事件-->            <i class="sidebar icon"></i>
        </a>
    </nav>

    <!--中间内容-->
    <div id="waypoint" class="me-container-small me-padded-tb-large ">
        <div class="container">
            <!--头部-->
            <div class="ui top attached segment"><!--上面是圆角，下面相连-->
                <div class="ui horizontal link list">
                    <div class="item"><!--图标？？-->
                        <img src="../static/images/girl.jpeg" alt="" class="ui avatar image"><!--avatar, 小图片-->
                        <div class="content">
                            <a href="#" class="header">泽宝宝</a>
                        </div>
                    </div>
                    <div class="item">
                        <i class="calendar icon"></i> 2020-05-24
                    </div>
                    <div class="item">
                        <i class="eye icon"></i> 2342
                    </div>
                </div>
            </div>

            <!--图片区域-->
            <div class="ui attached segment animated rubberBand">
                <img src="../static/images/girl.jpeg" alt="" class="ui fluid rounded image">
            </div>

            <!--内容-->
            <div class="ui attached segment padded">
                <div class="ui right aligned basic segment">
                    <div class="ui label basic orange">原创</div>
                </div>

                <br>
                <div id="content" class="typo typo-selection js-toc-content me-padded-lr me-padded-tb">
                    <h1 id="head" class="ui center aligned header">设计模式详解</h1>
                    <h2 id="1">1. 什么是设计模式</h2>
                    <p>设计模式（Design Pattern）是敲代码前辈们总结出对于代码的可复用性、可维护性、可读性、稳健性以及安全性的解决方案，是解决特定问题的一系列套路。帮助项目代码构建起一座坚实的地基，在后续修改原有功能时，避免出现牵一发动全身的蝴蝶效应</p>
                    <br>
                    <p>刚开始看设计模式代码感觉花里胡哨的。本可以通过一个简单方法完成的功能，使用了设计模式的方式创建了很多类，上跳下窜的经过了多个步骤才完成了功能，相对于平常CODING，设计模式的代码会更多</p>
                    <br>
                    <p>设计模式编写的代码确实繁琐，不过本质是面向对象设计原则的实际运用，是对类的封装性、继承性和多态性，以及类的关联关系和组合关系的充分理解</p>
                    <br>
                    <h2 id="2">2. 设计模式的好处</h2>
                    <p>帮助代码设计拥有<strong>可复用性、可维护性、可读性、稳健性以及安全性</strong></p>
                    <p>使用了设计模式的代码都拥有<strong>高内聚、低耦合</strong>的特性。什么是高内聚？什么是低耦合？<br>
                        <br></p>
                    <h3 id="2.1">2.1 高内聚、低耦合</h3>
                    <p>以公司的模式举例子。比如说研发部只负责系统的代码开发，人事部负责对人员进行招聘以及处理公司的一些事宜，公司中不同部门一般都是只负责一类事情。在软件开发中可以映射为，用户模块只负责用户的一些操作，不会出现财务流程相关的操作，这种称之为 <strong>高内聚</strong>，这一点和 <strong>单一责任原则</strong> 很相似</p>
                    <p><strong>低耦合</strong> 模式的意思就是要我们尽可能地减少类之间的连接。低耦合降低了因一个类的变化而影响其他类的范围，低耦合使类更容易理解，因为类会变得简单，更内聚。另外，不需要通信的两个对象之间，不要进行无谓的连接，连接了就有可能产生问题<br>
                        <br></p>
                    <h2 id="3">3. 六大基本原则</h2>
                    <h3 id="3.1">3.1 开闭原则（Open Close Principle）</h3>
                    <p><strong>对扩展开放，对修改关闭。</strong> 在程序需要进行拓展的时候，不能去修改原有的代码，实现一个热插拔的效果。简言之，是为了使程序的扩展性好，易于维护和升级。想要达到这样的效果，我们需要使用接口和抽象类</p>
                    <br>
                    <h3 id="3.2">3.2 里氏代换原则（Liskov Substitution Principle）</h3>
                    <p>尽量把父类设计为抽象类或者接口，让子类继承父类或实现父接口。<strong>子类可以扩展父类的功能，但不能改变父类原有的功能</strong></p>
                    <br>
                    <h3 id="3.3">3.3 依赖倒转原则（Dependence Inversion Principle）</h3>
                    <p>这个原则是开闭原则的基础，具体内容：<strong>针对接口编程，依赖于抽象而不依赖于具体</strong></p>

                    <pre><code class="language-java"><span class="token comment">// 面向接口编程</span>
Animal dog <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Dog</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// 面向具体实现编程</span>
Dog dog <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Dog</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre>
                    <br>
                    <h3 id="3.4">3.4 单一职责原则（Single Responsibility Principle）</h3>
                    <p>一个类只承担一个职责，不要让一个类承受的事情过多</p>
                    <p>总的来说：<strong>引起这个类引起变化的原因只有一个</strong></p>
                    <blockquote>
                        <p>比如WEB系统中的权限类，不要管用户相关的事宜。相当于不同模块间操作内容进行隔离</p>
                    </blockquote>
                    <br>
                    <h3 id="3.5">3.5 接口隔离原则（Interface Segregation Principle）</h3>
                    <p><strong>接口最小化</strong>。接口中的方法应该<strong>尽量少</strong>，保持定义接口时的语义。和单一职责原则类似</p>
                    <blockquote>
                        <p>单一职责针对的是<strong>类</strong><br>
                            接口隔离针对的是<strong>接口</strong></p>
                    </blockquote>
                    <br>
                    <h3 id="3.6">3.6 迪米特法则 | 最少知道原则（Demeter Principle）</h3>
                    <p>类向外公开的方法应该尽可能的少<br>
                        依赖的对象尽可能的少（只依赖必须依赖的对象）</p>
                    <br>
                    <h2 id="4">4.设计模式的分类</h2>
                    <p><strong>创建型模式：</strong> 对象实例化的模式，创建型模式用于解耦对象的实例化过程</p>
                    <p><strong>结构型模式：</strong> 把类或对象结合在一起形成一个更大的结构</p>
                    <p><strong>行为型模式：</strong> 类和对象如何交互，及划分责任和算法</p>
                    <h2 id="5">5. 个人总结</h2>
                    <p>代码是个程序员就能敲出来，但是如何写出可复用、可维护、稳健、安全的代码设计，却不是那么容易的事情</p>
                    <br>
                    <p>最初听闻设计模式的时候感觉这种方式离自己还很遥远，觉得不好学，有种畏惧的心理</p>
                    <br>
                    <p>但是随着了解了设计模式的六大原则，一个模式一个模式的去了解分析，不断的尝试在代码中合适的场景中去代入设计模式相关的概念，发现其实也没自己之前想的那么难。关键就是要用心学，最初看着忘着很正常，毕竟使用了设计模式的代码理念，和原有敲代码的行为习惯冲突很大，关键是要坚持的学下去</p>
                    <br>
                    <p>在使用设计模式之前，一定要搞清楚你想要的使用的这个设计模式的作用域在哪，能够解决什么问题。另外提出一点我个人推崇的一句话：<strong>“纸上得来终觉浅，绝知此事要躬行”,</strong> 搁那看十遍网上的例子，普遍都是些猫啊、狗啊、汽车、车场啥的，不如经过深思熟虑在项目中实际应用一场，这样才能牢固记住这个设计模式的运用场景及优点</p>
                    <br>
                    <p>当然，会用设计模式和在适当的场景下使用是两码事。比如，你发现了项目代码中有一个很长的<code>if else</code>，你就想来点骚操作，用自己刚学的策略模式哐哐哐的优化。在这里，如果这个判断语句是可穷举的，用策略模式去优化就失去了策略模式该有的语义，也是架构师经常和我提及的一个点，就是不要 <strong>过度设计</strong></p>
                    <br>
                    <p>最后要提的就是 <strong>学习设计模式没有捷径。</strong> 最终要达到的效果就是让设计模式的思想成为你开发技能的一部分，能够手到擒来，灵活运用。当然，这种效果不是你看一本书、看几篇博客、听别人口头上讲讲设计模式怎么怎么样就可以实现的，它需要不断沉淀与积累，在项目中合适的场景进行运用、总结。说来喝去就是一句话：<strong>"对于设计模式的学习不要急于求成，要循序渐进"</strong></p>
                    <br>
                    <p>希望通过这个 <strong>《设计模式》</strong> 专栏将自己所知、理解的设计模式通过博客文章的形式进行输出。专栏中博客皆为原创，如有错误之处希望各位大佬留言指正，不胜感激</p>
                </div>
                <div class="me-padded-lr me-padded-tb">
                    <div class="ui basic teal left pointing label">方法论</div>
                </div>

                <!--赞赏-->
                <div class="ui center aligned basic segment">
                    <button id="payButton" class="ui orange basic circular button">赞赏</button><!--circular加大圆角-->
                </div>
                <div class="ui payQR flowing popup top left transition hidden">
                    <div class="ui orange basic label">
                        <div class="ui images" style="font-size: inherit"><!--继承上级的字体（此处默认为0不显示）-->
                            <div class="ui rounded bordered image" style="width: 120px">
                                <img src="../static/images/wechat.jpg" alt="">
                                <div>支付宝支付</div>
                            </div>
                            <div class="ui rounded bordered image" style="width: 120px">
                                <img src="../static/images/wechat.jpg" alt="">
                                <div>微信支付</div>
                            </div>
                        </div>
                    </div>
                </div>

            </div>

            <!--信息-->
            <div class="ui attached positive message"> <!--positive 变颜色-->
                <div class="ui middle aligned grid">
                    <div class="eleven wide column">
                        <ul class="list me-blue">
                            <li>作者：泽宝宝（联系作者）</li>
                            <li>发表时间：2020-02-20</li>
                            <li>版权声明：自由转载-非商用</li>
                            <li>公众号转载：添加二维码</li>
                        </ul>
                    </div>
                    <div class="five wide column">
                        <!--right floated靠最右-->
                        <img src="../static/images/wechat.jpg" alt="" class="ui right floated rounded bordered image" style="width: 110px">
                    </div>
                </div>
            </div>

            <!--留言区域-->
            <div id="comment-container" class="ui bottom attached segment me-margin-bottom-medium">
                <!--留言区域列表-->
                <div class="ui teal segment">
                    <div class="ui comments">
                        <h3 class="ui dividing header">Comments</h3>
                        <div class="comment">
                            <a class="avatar">
                                <img src="../static/images/wechat.jpg">
                            </a>
                            <div class="content">
                                <a class="author">Matt</a>
                                <div class="metadata">
                                    <span class="date">Today at 5:42PM</span>
                                </div>
                                <div class="text">
                                    How artistic!
                                </div>
                                <div class="actions">
                                    <a class="reply">Reply</a>
                                </div>
                            </div>
                        </div>
                        <div class="comment">
                            <a class="avatar">
                                <img src="../static/images/wechat.jpg">
                            </a>
                            <div class="content">
                                <a class="author">Elliot Fu</a>
                                <div class="metadata">
                                    <span class="date">Yesterday at 12:30AM</span>
                                </div>
                                <div class="text">
                                    <p>This has been very useful for my research. Thanks as well!</p>
                                </div>
                                <div class="actions">
                                    <a class="reply">Reply</a>
                                </div>
                            </div>
                            <div class="comments">
                                <div class="comment">
                                    <a class="avatar">
                                        <img src="../static/images/wechat.jpg">
                                    </a>
                                    <div class="content">
                                        <a class="author">Jenny Hess</a>
                                        <div class="metadata">
                                            <span class="date">Just now</span>
                                        </div>
                                        <div class="text">
                                            Elliot you are always so right :)
                                        </div>
                                        <div class="actions">
                                            <a class="reply">Reply</a>
                                        </div>
                                    </div>
                                </div>
                            </div>
                        </div>
                        <div class="comment">
                            <a class="avatar">
                                <img src="../static/images/wechat.jpg">
                            </a>
                            <div class="content">
                                <a class="author">Joe Henderson</a>
                                <div class="metadata">
                                    <span class="date">5 days ago</span>
                                </div>
                                <div class="text">
                                    Dude, this is awesome. Thanks so much
                                </div>
                                <div class="actions">
                                    <a class="reply">Reply</a>
                                </div>
                            </div>
                        </div>

                    </div>
                </div>
                <!--提交留言区域-->
                <div class="ui blue segment">
                    <form class="ui reply form">
                        <div class="field">
                            <textarea name="content" placeholder="请输入评论信息"></textarea>
                        </div>
                        <div class="fields">
                            <div class="field me-mobile-wide me-margin-bottom-tiny">
                                <div class="ui left icon input">
                                    <i class="user icon"></i>
                                    <input type="text" name="nickname" placeholder="用户">
                                </div>
                            </div>
                            <div class="field me-mobile-wide me-margin-bottom-tiny">
                                <div class="ui left icon input">
                                    <i class="mail icon"></i>
                                    <input type="text" name="nickname" placeholder="邮箱">
                                </div>
                            </div>
                            <!--两个都加wide才能手机端充满-->
                            <div class="field me-mobile-wide">
                                <button class="ui blue labeled submit icon me-mobile-wide button">
                                    <i class="icon edit"></i> Add Reply
                                </button>
                            </div>
                        </div>

                    </form>
                </div>
            </div>
        </div>
    </div>

    <!--工具条--><!--使用绝对布局-->
    <div id="toolbar" class="me-right-bottom me-fixed me-padded-large" style="display: none">
        <div class="ui vertical icon buttons">
            <button type="button" class="ui toc teal button">目录</button>
            <a href="#comment-container" type="button" class="ui teal button">留言</a><!--#id，超链接到-->
            <button type="button" class="ui wechat button"><i class="weixin icon"></i></button><!--扫码阅读-->
            <div id="toTop-button" class="ui button"><i class="chevron up icon"></i></div><!--#回到顶部-->
        </div>
    </div>

    <div class="ui toc-container flowing popup transition hidden" style="width: 200px">
        <ol class="js-toc"></ol>
    </div>

    <div id="qrcode" class="ui wechat-QR flowing popup top left transition hidden" style="width: 130px !important;">
<!--        <img src="./static/images/wechat.jpg" alt="" class="ui rounded image" style="width: 100px !important;">-->
    </div>

    <!--底部footer-->
    <footer class="ui inverted vertical segment me-padded-tb-max"><!--vertical消除圆角，用attached好像也行-->
        <div class="ui center aligned container"><!--居中-->
            <div class="ui inverted divided grid stackable"><!--grid stackable默认均匀分成16份, divided分割线-->
                <div class="three wide column">
                    <div class="ui inverted link list">
                        <div class="item">
                            <img src="../static/images/wechat.jpg" class="ui rounded image" alt="" style="width: 110px"><!--alt规定图片无法显示时的替代文本-->
                        </div>
                    </div>
                </div>
                <div class="three wide column">
                    <h4 class="ui inverted header me-text-space me-opacity-mini">最新博客</h4><!--标题-->
                    <div class="ui inverted link list">
                        <a href="#" class="item me-text-thin me-text-lined">用户故事</a>
                        <a href="#" class="item me-text-thin me-text-lined">用户故事</a>
                        <a href="#" class="item me-text-thin me-text-lined">用户故事</a>
                    </div>
                </div>
                <div class="three wide column">
                    <h4 class="ui inverted header me-text-space me-opacity-mini">联系我</h4><!--标题-->
                    <div class="ui inverted link list">
                        <a href="#" class="item me-text-thin me-text-lined">Email: stg1205@163.com</a>
                        <a href="#" class="item me-text-thin me-text-lined">QQ: 1014922487</a>
                    </div>
                </div>
                <div class="seven wide column">
                    <h4 class="ui inverted header me-text-space me-opacity-mini">介绍</h4>
                    <p class="me-text-space me-text-thin me-text-lined me-opacity-mini">这是我的个人博客，啦啦啦啦啦啦拉拉拉啊拉啦阿拉</p>
                </div>
            </div>
            <div class="ui inverted section divider"></div>
            <p class="me-text-space me-opacity-tiny">Copyright</p>
        </div>

    </footer>
<script
        src="https://code.jquery.com/jquery-3.1.1.min.js"
        integrity="sha256-hVVnYaiADRTO2PzUGmuLJr8BLUSjGIZsDYGmIJLv2b8="
        crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/semantic-ui/2.2.10/semantic.min.js"></script>
<script src="//cdn.jsdelivr.net/npm/jquery.scrollto@2.1.2/jquery.scrollTo.min.js"></script>
<script src="../static/lib/prism/prism.js"></script><!--代码高亮-->
<script src="../static/lib/tocbot/tocbot.min.js"></script><!--目录生成-->
<script src="../static/lib/qrcode/qrcode.min.js"></script>
<script src="../static/lib/waypoints/jquery.waypoints.min.js"></script>
    <script>
        $('.menu.toggle').click(function () {
            $('.m-item').toggleClass('me-mobile-hide');/*toggleClass，取反函数*/
        });

        $('#payButton').popup({//二维码pop up
            popup: $('.payQR.popup'),
            on: 'click',
            position: 'bottom center'
        });

        $('.wechat').popup({
            popup: $('.wechat-QR.popup'),
            position: 'left center'
        })

        //多了就有问题 显示不全
        $('.toc').popup({//目录pop up
            popup: $('.toc-container'),
            on: 'click',
            position: 'left center'
        });

        /*目录初始化，指定生成位置，来源以及标签样式*/
        tocbot.init({
            //where to render the table of contents
            tocSelector: '.js-toc',
            //where to grab the headings to build the table of contents
            contentSelector: '.js-toc-content',
            //which headings to grab inside of the contentSelector element
            headingSelector: 'h1, h2, h3',
        });

        /*QR初始化*/
        var qrcode = new QRCode("qrcode", {
            text: "http://jindo.dev.naver.com/collie",
            width: 100,
            height: 100,
            colorDark : "#000000",
            colorLight : "#ffffff",
            correctLevel : QRCode.CorrectLevel.H
        });

        /*滚动动画*/
        $('#toTop-button').click(function () {
            $(window).scrollTo(0, 500) /*设置滚动时间*/
        });

        /*waypoints实现滚动检测*/
        var waypoint = new Waypoint({
            element: document.getElementById('waypoint'),
            handler: function(direction) {
                if (direction === 'down') {
                    $('#toolbar').show(500);
                } else {
                    $('#toolbar').hide(500);
                }
                console.log('Scrolled to waypoint!' + direction)
            }
        })
    </script>
</body>
</html>